#第十五章 上下文管理器和else块

import os
print(os.path.split(__file__))

#在for、while、try中使用else块

#for、while循环中没有执行break才会执行else
#比如这样的逻辑 else 块就很有用了
ary = [1,2,3,5]
for i in ary:
    if i >=10:
        break
else:
    print("数组中的所有元素都没有大于10 ") #类似这些逻辑在没有else块的语言中通常会设立一个flag值跳出循环后判断

print('abcd'[::-1])


#在try中的else块
try:
    pass
except expression as identifier:
    pass
else:
    pass #没有出现异常就会执行

#自定义的上下文管理器类

class LookClass():

    def __enter__(self): #上下文管理器会调用该方法 返回的值会赋给as后面的字段 可以返回None
        import sys
        self.sys_write = sys.stdout.write
        sys.stdout.write = self.reverse_write #进入上下文管理 改变标准输出的函数
        return "kungfu"

    def reverse_write(self,text):
        self.sys_write(text[::-1])
       
    #参数说明：异常类、异常实例、traceback 对象
    def __exit__(self,exc_type,exc_value,traceback): #上下文管理器结束后会执行该方法
        import sys
        sys.stdout.write = self.sys_write
        if exc_type is ZeroDivisionError:
            return True

with LookClass() as what:
    print("Hello world")
    print(what)

print(what,type(what)) #注意 as 的实例对象不会自动销毁

import contextlib

@contextlib.contextmanager #通过装饰器实现上下文管理器类 LookClass 一样的功能
def looking_class():
    import sys
    sys_write = sys.stdout.write    
    def reverse_write(text):
        sys_write(text[::-1])
    sys.stdout.write = reverse_write
    yield "kungfu"
    sys.stdout.write = sys_write
    
    